#ifndef CPPDEF_H_
#define CPPDEF_H_

#define CPPDEF_BASE			0	/* ﾍﾞｰｽ状態(MIN_ARRAYの固定値)	*/
#define CPPDEF_DEF			1	/* #define					*/
#define CPPDEF_UNDEF		2	/* #undef					*/
#define CPPDEF_INC			3	/* #include					*/
#define CPPDEF_IF			4	/* #if						*/
#define CPPDEF_ELIF			5	/* #elif					*/
#define CPPDEF_ELSE			6	/* #else					*/
#define CPPDEF_ENDIF		7	/* #endif					*/
#define CPPDEF_IFDEF		8	/* #ifdef					*/
#define CPPDEF_IFNDEF		9	/* #ifndef					*/
#define CPPDEF_LINE	       10	/* #line					*/
#define CPPDEF_ERROR	   11	/* #error					*/
#define CPPDEF_PRAGMA	   12	/* #pragma					*/
#define CPPDEF_INCNEXT     13

#define	EXT_PARAM			0x0001	/* 引数				*/
#define	EXT_SPARAM			0x0002	/* "#"+引数			*/
#define	EXT_DSPARAM			0x0004	/* 引数+"##"			*/
#define	EXT_SPARAMDS		0x0008	/* "#"+引数+"##"		*/
#define	EXT_STRING			0x0010	/* 引数以外			*/
#define	EXT_SSTRING			0x0020	/* "#"+引数以外		*/
#define	EXT_DSSTRING		0x0040	/* 引数以外+"##"		*/
#define	EXT_SSTRINGDS		0x0080	/* "#"+引数以外+"##"	*/
#define	EXT_MASK_STR		0x00F0	/* "#"+引数以外+"##"	*/
#define	EXT_MASK_PAR		0x000F	/* "#"+引数以外+"##"	*/
/*--------------------------------------------------------------*/
/* マクロ名定義                                                  */
/*--------------------------------------------------------------*/
#define MACRO_UNCHANGEABLE		 	0
#define MACRO_CHANGEABLE		 	1
#define MACRO_CHANGED			 	2

#define MACRO_KIND_NONE				0x0000
#define MACRO_KIND_STD				0x0010
#define MACRO_KIND_LINE				0x0020
#define MACRO_KIND_FILE				0x0040
#define MACRO_KIND_FUNC				0x0080
#define MACRO_KIND_DATE				0x0100
#define MACRO_KIND_TIME				0x0200
#define MACRO_KIND_SRC				0x0400
#define MACRO_KIND_STDC				0x0800
#define MACRO_OBJ					0x0001
#define MACRO_FUNC					0x0002
/*--------------------------------------------------------------*/
/* Cpp通用バッファーサイズ                       							*/
/*--------------------------------------------------------------*/
#define CPP_GNL_BUFFER_SIZE			1024

/*共用マクロ　*/
#define CUR_TOKEN_INDEX				(CppTokenGetCurrOne())

typedef struct _INDEFINABLEMACRO {
	PSZ		pszMacroName;
	UCHAR   bValid;
}INDEFINABLEMACRO;

/*--------------------------------------------------------------*/
/*--------------------------------------------------------------*/
/*  カレントフォルダのパス名 */
extern CHAR szCurrentDirectory[OS_FULLPATH+4] ;
/* CPP用グローバルのエラーコード */
extern S4	gblErrorFlag ;

/* マクロ名検索用*/

extern U2	uIncludeNestLvl;

extern INDEFINABLEMACRO stIndefinableMacro[];
/*--------------------------------------------------------------*/
/* Cpp内部用関数プロットタイプ */
/*--------------------------------------------------------------*/
S4  CppDefMain(VOID);
S4  CppEndifMain(VOID);
S4  CppElseMain(VOID);
S4  CppIfdefMain(VOID);
S4  CppIfndefMain(VOID);
S4  CppIfMain(VOID);
S4  CppElifMain(VOID);
S4  CppUndefMain(VOID);
S4  CppIncMain(VOID);
S4 CppIncNextMain(VOID);
BOOL CppIncIsDirectiveCmd( PSZ pszCmd, U4 len );
S4  CppLineMain(VOID);
S4  CppErrorMain(VOID);
S4  CppPragmaMain(VOID);
S4  CppIfFileFinished( VOID );
S4  CppCtrlMain(PSZ pszSrc);
S4  CppCtlGetLoc(AST *pastLoc);
S4  CppCtlReqMain(PSZ pszLine);
S4  CppTokenGetNextToken(BOOL bSkipSpace, BOOL bReadNextLine);
VOID CppSetExitCode( AST  astLocation,  U2 usCode, U2 usNum, ...  );
S4  CppTokenGetTokens(PSZ pszStart, BOOL bHeader);
S4 CppIncPopCurrent( VOID );
S4  CppIncAddCurrent(PSZ pszSrc, U4 uNestLvl);
S4  CppRepTmpToken(AST start, AST* pend);
S4  CppRepTmpNewCtrl(AST astPP, AST* pastEnd, AST astMacroDef);
S4	 CppRepMain();
S4 CppRepOutputToken( AST astPPToken );
BOOL  CppDefSearchMacro(PSZ pszMacroName, AST *pastMacroCtrl);
S4  CppTokenDeleteTokensBeforeCurr( AST astToken );
S4  CppTokenMoveEndTokensToPrev( AST astToken, AST astCnt );
AST CppTokenGetLastOne( VOID );
AST CppTokenGetLastNamedToken();
VOID CppTokenResetLastOne( AST astToken );
S4 CppTokenResetCurrOne( AST astToken );
AST CppTokenGetFirstOne( VOID );
BOOL CppTokenIsFinished( VOID );
AST CppTokenGetCurrOne( VOID );
S4  CppTokensDelAll(VOID);
S4		CppResultOutput( AST  astStart, BOOL  bMacroCall );
S4		CppResultInit( PSZ pszSrc, PSZ pszOut );
S4		CppResultTerminal( VOID );
S4 CppLocGetCodeScope(AST *pastCodeScp);
S4 CppLineFeed(VOID);
S4 CppCtlGetFileBuffer( CHAR ** pBuffer );
VOID CppLocScopeStart(VOID);
VOID CppLocScopeStep( S4 steps );
AST  CppTokenNewOne( U2 tokenKind, AST codescp, PSZ name );
S4 CppLocSetDirectiveScope( AST nNewDirInfo );
VOID  CppThrowWarning( U4 code, AST astCodeScp, PSZ pszParameter, ALERT_MSG_PARAM* pszValue );
#endif /*CPPDEF_H_*/
